package com.adam.framework.db.page;


public class Page implements java.io.Serializable {
    public static final Page EMPTY_PAGE = new Page();
    public static final int DEFAULT_PAGE_SIZE = 10;
    public static final int MAX_PAGE_SIZE = 9999;

    private int myPageSize = DEFAULT_PAGE_SIZE;

    private int start;
    private int avaCount,totalSize;
    private Object data;

    private int currentPageno;
    private int totalPageCount;

    /**
     * 默认构造方法，只构造空页
     */
    protected Page() {
        this.init(0, 0, 0, DEFAULT_PAGE_SIZE, new Object());
    }

    /**
     * 分页数据初始方法，由子类调用
     * @param start 本页数据在数据库中的起始位置
     * @param avaCount 本页包含的数据条数
     * @param totalSize 数据库中总记录条数
     * @param pageSize 本页容量
     * @param data 本页包含的数据
     */
    protected void init(int start, int avaCount, int totalSize, int pageSize, Object data) {

        this.avaCount = avaCount;
        this.myPageSize = pageSize;

        this.start = start;
        this.totalSize = totalSize;

        this.data = data;

        //System.out.println("avaCount:"+avaCount);
        //System.out.println("totalSize:"+totalSize);
        if (avaCount > totalSize) {
            //throw new RuntimeException("记录条数大于总条数？！");
        }

        this.currentPageno = (start - 1) / pageSize + 1;
        this.totalPageCount = (totalSize + pageSize - 1) / pageSize;

        if (totalSize == 0 && avaCount == 0) {
            this.currentPageno = 1;
            this.totalPageCount = 1;
        }
        //System.out.println("Start Index to Page No: " + start + "-" + currentPageno);
    }

    public Object getData() {
        return this.data;
    }

    /**
     * 取本页数据容量（本页能包含的记录数）
     * @return 本页能包含的记录数
     */
    public int getPageSize() {
        return this.myPageSize;
    }

    /**
     * 是否有下一页
     * @return 是否有下一页
     */
    public boolean hasNextPage() {
        /*
          if (avaCount==0 && totalSize==0){
              return false;
          }
          return (start + avaCount -1) < totalSize;
         */
        return (this.getCurrentPageNo() < this.getTotalPageCount());
    }

    /**
     * 是否有上一页
     * @return  是否有上一页
     */
    public boolean hasPreviousPage() {
        /*
          return start > 1;
         */
        return (this.getCurrentPageNo() > 1);
    }

    /**
     * 获取当前页第一条数据在数据库中的位置
     * @return
     */
    public int getStart() {
        return start;
    }

    /**
     * 获取当前页最后一条数据在数据库中的位置
     * @return
     */
    public int getEnd() {
        int end = this.getStart() + this.getSize() - 1;
        if (end < 0) end = 0;
        return end;
    }

    /**
     * 获取上一页第一条数据在数据库中的位置
     * @return 记录对应的rownum
     */
    public int getStartOfPreviousPage() {
        return Math.max(start - myPageSize, 1);
    }


    /**
     * 获取下一页第一条数据在数据库中的位置
     * @return 记录对应的rownum
     */
    public int getStartOfNextPage() {
        return start + avaCount;
    }

    /**
     * 获取任一页第一条数据在数据库中的位置，每页条数使用默认值
     * @param pageNo 页号
     * @return 记录对应的rownum
     */
    public static int getStartOfAnyPage(int pageNo) {
        return getStartOfAnyPage(pageNo, DEFAULT_PAGE_SIZE);
    }

    /**
     * 获取任一页第一条数据在数据库中的位置
     * @param pageNo 页号
     * @param pageSize 每页包含的记录数
     * @return 记录对应的rownum
     */
    public static int getStartOfAnyPage(int pageNo, int pageSize) {
        int startIndex = (pageNo - 1) * pageSize + 1;
        if (startIndex < 1) startIndex = 1;
        //System.out.println("Page No to Start Index: " + pageNo + "-" + startIndex);
        return startIndex;
    }

    /**
     * 取本页包含的记录数
     * @return 本页包含的记录数
     */
    public int getSize() {
        return avaCount;
    }

    /**
     * 取数据库中包含的总记录数
     * @return 数据库中包含的总记录数
     */
    public int getTotalSize() {
        return this.totalSize;
    }

    /**
     * 取当前页码
     * @return 当前页码
     */
    public int getCurrentPageNo() {
        return this.currentPageno;
    }

    /**
     * 取总页码
     * @return 总页码
     */
    public int getTotalPageCount() {
        return this.totalPageCount;
    }

}
